package com.demo.树;

import cn.hutool.core.lang.Console;
import org.junit.Test;

import java.util.Arrays;

/**
 * 树的测试类
 * @author cl
 */
public class TreeTest {

    @Test
    public void 字典树测试() {
        Console.log("字典树测试");
        Trie trie = new Trie("cat", "dog", "door", "deer", "panda");
        字典树情况打印(trie);

        System.out.println();
        Console.log("字典树测试, 添加一个单词 dog");
        trie.addWord("dog");
        字典树情况打印(trie);

        System.out.println();
        Console.log("字典树测试, 删除一个单词 dog");
        trie.delWord("dog");
        字典树情况打印(trie);

        System.out.println();
        Console.log("字典树测试, 删除一个单词 dog");
        trie.delWord("dog");
        字典树情况打印(trie);
    }

    private void 字典树情况打印(Trie trie) {
        Console.log("字典树: 共有 {} 个单词, {}", trie.size(), Arrays.toString(trie.getData().toArray()));
        Console.log("字典树: 空字符串有 {} 个", trie.getWordNum(""));
        Console.log("字典树: 节点数是： {} 个", trie.getNodes().size());
        Console.log("字典树: 出现最多的单词是： {} ", trie.getMaxWord().word);
        Console.log("字典树: 出现最少的单词是： {} ", trie.getMinWord().word);
        Console.log("字典树: dog 的单词有 {} 个", trie.getWordNum("dog"));
        Console.log("字典树: de 的单词有 {} 个", trie.getWordNum("de"));
        Console.log("字典树: do 开头的单词有 {} 个", trie.getPrifixWordNum("do"));
        Console.log("字典树: panda 存在否： {}", trie.wordExists("panda"));
        Trie.TrieNode node = trie.getWordNode("door");
        if (node != null) {
            Console.log("字典树: door 所在节点的信息是： word: {}, pass: {}, end: {}", node.word, node.pass, node.end);
        }
        node = trie.getWordNode("do");
        if (node != null) {
            Console.log("字典树: do 所在节点的信息是： word: {}, pass: {}, end: {}", node.word, node.pass, node.end);
        }
        node = trie.getWordNode("dog");
        if (node != null) {
            Console.log("字典树: dog 所在节点的信息是： word: {}, pass: {}, end: {}", node.word, node.pass, node.end);
        }
        Console.log("所有的节点信息是: {}", Arrays.toString(trie.getNodes().stream().map(Trie.TrieNode::getWord).toArray()));
    }
}
